package com.huashi.dealer.commonEntity;

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.huashi.dealer.core.handler.HtmlContentTypeHandler;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 商品模型类
 * 对应数据库表 yoshop_goods
 */
@Data
@EqualsAndHashCode(callSuper = true)
@Schema(description = "商品实体")
@TableName("yoshop_goods")
public class Goods extends BaseModel {

    /**
     * 商品ID
     */
    @TableId(value = "goods_id", type = IdType.AUTO)
    @Schema(description = "商品ID")
    private Long goodsId;

    /**
     * 商品名称
     */
    @Schema(description = "商品名称")
    private String goodsName;

    /**
     * 商品卖点
     */
    @Schema(description = "商品卖点")
    private String sellingPoint;

    /**
     * 商品分类ID
     */
    @TableField("category_id")
    @Schema(description = "商品分类ID")
    private Long categoryId;

    /**
     * 条形码
     */
    @TableField("bar_code")
    @Schema(description = "条形码")
    private String barCode;

    /**
     * 商品规格(10单规格 20多规格)
     */
    @TableField("spec_type")
    @Schema(description = "商品规格：10单规格，20多规格")
    private Integer specType;

    /**
     * 库存计算方式(10下单减库存 20付款减库存)
     */
    @TableField("deduct_stock_type")
    @Schema(description = "库存计算方式：10下单减库存，20付款减库存")
    private Integer deductStockType;

    /**
     * 商品详情
     */
    @Schema(description = "商品详情")
    @TableField(value = "content", typeHandler = HtmlContentTypeHandler.class)
    private String content;

    /**
     * 初始销量
     */
    @TableField("sales_initial")
    @Schema(description = "初始销量")
    private Integer salesInitial;

    /**
     * 实际销量
     */
    @TableField("sales_actual")
    @Schema(description = "实际销量")
    private Integer salesActual;

    /**
     * 赠品数量
     */
    @TableField("gift_stock_num")
    @Schema(description = "赠品数量")
    private Integer giftStockNum;
    /**
     * 商品排序(数字越小越靠前)
     */
    @TableField("goods_sort")
    @Schema(description = "商品排序(数字越小越靠前)")
    private Integer goodsSort;

    /**
     * 配送模板id
     */
    @TableField("delivery_id")
    @Schema(description = "配送模板ID")
    private Long deliveryId;

    /**
     * 是否开启积分赠送(1开启 0关闭)
     */
    @TableField("is_points_gift")
    @Schema(description = "是否开启积分赠送：1开启，0关闭")
    private Integer isPointsGift;

    /**
     * 是否允许使用积分抵扣(1允许 0不允许)
     */
    @TableField("is_points_discount")
    @Schema(description = "是否允许使用积分抵扣：1允许，0不允许")
    private Integer isPointsDiscount;

    /**
     * 是否开启会员折扣(1开启 0关闭)
     */
    @TableField("is_enable_grade")
    @Schema(description = "是否开启会员折扣：1开启，0关闭")
    private Integer isEnableGrade;

    /**
     * 会员折扣设置(0默认等级折扣 1单独设置折扣)
     */
    @TableField("is_alone_grade")
    @Schema(description = "会员折扣设置：0默认等级折扣，1单独设置折扣")
    private Integer isAloneGrade;

    /**
     * 单独设置折扣的配置
     */
    @TableField("alone_grade_equity")
    @Schema(description = "单独设置折扣的配置")
    private String aloneGradeEquity;

    /**
     * 是否开启单独分销(0关闭 1开启)
     */
    @TableField("is_ind_dealer")
    @Schema(description = "是否开启单独分销：0关闭，1开启")
    private Integer isIndDealer;

    /**
     * 分销佣金类型(10百分比 20固定金额)
     */
    @TableField("dealer_money_type")
    @Schema(description = "分销佣金类型：10百分比，20固定金额")
    private Integer dealerMoneyType;

    /**
     * 分销佣金(一级)
     */
    @TableField("first_money")
    @Schema(description = "分销佣金(一级)")
    private BigDecimal firstMoney;

    /**
     * 分销佣金(二级)
     */
    @TableField("second_money")
    @Schema(description = "分销佣金(二级)")
    private BigDecimal secondMoney;

    /**
     * 分销佣金(三级)
     */
    @TableField("third_money")
    @Schema(description = "分销佣金(三级)")
    private BigDecimal thirdMoney;

    /**
     * 商品状态(10上架 20下架)
     */
    @TableField("goods_status")
    @Schema(description = "商品状态：10上架，20下架")
    private Integer goodsStatus;

    /**
     * 是否新品(10是 20否)
     */
    @Schema(description = "是否新品：10是，20否")
    private Integer isNewproduct;

    /**
     * 是否爆款(10是 20否)
     */
    @Schema(description = "是否爆款：10是，20否")
    private Integer isHotsellingitem;

    /**
     * 分类（10商品，20赠品）
     */
    @TableField("is_type")
    @Schema(description = "分类：10商品，20赠品")
    private Integer isType;

    // ========== 扩展字段（不在数据库表中） ==========

    /**
     * 商品销量（计算字段）
     */
    @TableField(exist = false)
    @Schema(description = "商品销量（计算字段）")
    private Integer goodsSales;

    /**
     * 商品价格
     */
    @TableField(exist = false)
    @Schema(description = "商品价格")
    private BigDecimal goodsPrice;

    /**
     * 商品原价
     */
    @TableField(exist = false)
    @Schema(description = "商品原价")
    private BigDecimal goodsOriginalPrice;

    /**
     * 商品库存
     */
    @TableField(exist = false)
    @Schema(description = "商品库存")
    private Integer goodsStock;

    /**
     * 商品图片
     */
    @TableField(exist = false)
    @Schema(description = "商品图片")
    private String goodsImage;

    /**
     * 商品图片
     */
    @TableField(exist = false)
    @Schema(description = "商品图片")
    private List<String> goodsImageList;

    /**
     * 商品状态文本
     */
    @TableField(exist = false)
    @Schema(description = "商品状态文本")
    private String goodsStatusText;

    /**
     * 商品分类
     */
    @TableField(exist = false)
    @Schema(description = "商品分类")
    private Category category;

    /**
     * 商品规格
     */
    @TableField(exist = false)
    @Schema(description = "商品规格")
    private List<GoodsSku> sku;

    /**
     * 商品图片
     */
    @TableField(exist = false)
    @Schema(description = "商品图片")
    private List<GoodsImage> image;

    /**
     * 商品条码
     */
    @TableField(exist = false)
    @Schema(description = "商品条码")
    private List<GoodsBarcode> barcode;
    /**
     * 软删除
     */
    @TableField("is_delete")
    @Schema(description = "软删除")
    @TableLogic
    private Integer isDelete;

    /**
     * 创建时间
     */
    @TableField("create_time")
    @Schema(description = "创建时间")
    private Long createTime;

    /**
     * 更新时间
     */
    @TableField("update_time")
    @Schema(description = "更新时间")
    private Long updateTime;
    // ========== 业务方法 ==========

    /**
     * 获取商品销量
     */
    public Integer getGoodsSales() {
        return (salesInitial != null ? salesInitial : 0) + (salesActual != null ? salesActual : 0);
    }

    /**
     * 获取商品状态文本
     */
    public String getGoodsStatusText() {
        if (goodsStatus == null) {
            return "";
        }
        switch (goodsStatus) {
            case 10:
                return "上架";
            case 20:
                return "下架";
            default:
                return "";
        }
    }

    /**
     * 获取规格类型文本
     */
    public String getSpecTypeText() {
        if (specType == null) {
            return "";
        }
        switch (specType) {
            case 10:
                return "单规格";
            case 20:
                return "多规格";
            default:
                return "";
        }
    }

    /**
     * 获取库存计算方式文本
     */
    public String getDeductStockTypeText() {
        if (deductStockType == null) {
            return "";
        }
        switch (deductStockType) {
            case 10:
                return "下单减库存";
            case 20:
                return "付款减库存";
            default:
                return "";
        }
    }

    /**
     * 获取分销佣金类型文本
     */
    public String getDealerMoneyTypeText() {
        if (dealerMoneyType == null) {
            return "";
        }
        switch (dealerMoneyType) {
            case 10:
                return "百分比";
            case 20:
                return "固定金额";
            default:
                return "";
        }
    }

    /**
     * 获取商品类型文本
     */
    public String getIsTypeText() {
        if (isType == null) {
            return "";
        }
        switch (isType) {
            case 10:
                return "商品";
            case 20:
                return "赠品";
            default:
                return "";
        }
    }

    /**
     * 判断是否上架
     */
    public boolean isOnSale() {
        return goodsStatus != null && goodsStatus == 10;
    }

    /**
     * 判断是否新品
     */
    public boolean isNewProduct() {
        return isNewproduct != null && isNewproduct == 10;
    }

    /**
     * 判断是否爆款
     */
    public boolean isHotSelling() {
        return isHotsellingitem != null && isHotsellingitem == 10;
    }

    /**
     * 判断是否开启积分赠送
     */
    public boolean isPointsGiftEnabled() {
        return isPointsGift != null && isPointsGift == 1;
    }

    /**
     * 判断是否允许积分抵扣
     */
    public boolean isPointsDiscountEnabled() {
        return isPointsDiscount != null && isPointsDiscount == 1;
    }

    /**
     * 判断是否开启会员折扣
     */
    public boolean isGradeEnabled() {
        return isEnableGrade != null && isEnableGrade == 1;
    }

    /**
     * 判断是否开启单独分销
     */
    public boolean isIndDealerEnabled() {
        return isIndDealer != null && isIndDealer == 1;
    }
} 